const express = require('express')
const favicon = require('serve-favicon')
const bodyParser = require('body-parser')
const session = require('express-session')
const serverRender = require('./util/server.render')
const fs = require('fs')
const path = require('path')
const isDev = process.env.NODE_ENV === 'development'

const app = express()

// 把post请求回来的数据转换为req.body上的数据
app.use(bodyParser.json())

// 把get请求回来的数据转换为req.body上的数据
app.use(bodyParser.urlencoded({ extended: false }))

app.use(session({
  // 生命周期
  maxAge: 10 * 60 * 1000,
  // 浏览器上的cookie id名字
  name: 'tid',
  // 是否每次请求都生成一个cookie id
  resave: false,
  saveUninitialized: false,
  // 加密字段
  secret: 'react code class'
}))

app.use(favicon(path.join(__dirname, '../favicon.ico')))

app.use('/api/user', require('./util/handle-login'))
app.use('/api', require('./util/proxy'))

if (!isDev) {
  const serverEntry = require('../dist/server.entry.js')
  const template = fs.readFileSync(path.join(__dirname, '../dist/server.ejs'), 'utf8')

  // 只要是pubilc下的文件,都全部静态返回
  app.use('/public', express.static(path.join(__dirname, '../dist')))

  app.get('*', function (req, res, next) {
    serverRender(serverEntry, template, req, res).catch(next)
  })
} else {
  const devStatic = require('./util/dev-static')

  devStatic(app)
}

// 处理error,必须传入4个参数,express会根据传入的值的长度来判断是否为error handle
app.use(function (error, req, res, next) {
  console.log(error)
  res.status(500).send(error)
})

const host = process.env.HOST || '0.0.0.0'
const port = process.env.PORT || 3333
app.listen(port, host, function () {
  console.log('server is listening on 3333')
})
